#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
角速度标定命令行界面

该程序为角速度标定程序提供命令行参数接口，使用户能够灵活配置标定过程。
通过命令行参数可以选择数据源、调整处理参数和指定输出位置等。
"""

import os  # 用于文件路径处理
import sys  # 用于系统级操作，如退出程序
import argparse  # 用于解析命令行参数
import matplotlib as mpl  # 绘图库
# 设置Agg后端，确保在无GUI环境下也能正常生成图像
mpl.use('Agg')
from 角速度标定 import main as calibration_main  # 导入标定主程序

def parse_arguments():
    """解析命令行参数
    
    设置并解析用户通过命令行提供的配置选项，包括数据选择、模型参数和输出设置等。
    
    返回:
        argparse.Namespace: 包含所有解析后的命令行参数
    """
    parser = argparse.ArgumentParser(description='角速度标定工具')
    
    parser.add_argument('--show-results', action='store_true',
                        help='在标定完成后尝试打开结果图像')
    
    parser.add_argument('--rtk-only', action='store_true',
                        help='仅处理RTK角速度数据')
    
    parser.add_argument('--imu-only', action='store_true',
                        help='仅处理IMU角速度数据')
    
    parser.add_argument('--no-combined', action='store_true',
                        help='不生成合并分析结果')
    
    parser.add_argument('--poly-degree', type=int, default=2,
                        help='多项式拟合次数 (默认: 2)')
    
    parser.add_argument('--window-size-ratio', type=float, default=0.1,
                        help='滑动窗口大小比例 (默认: 0.1)')
    
    parser.add_argument('--diff-threshold-ratio', type=float, default=0.1,
                        help='角速度差分阈值比例 (默认: 0.1)')
    
    parser.add_argument('--output-dir', type=str, default='',
                        help='输出目录 (默认为脚本所在目录)')
    
    return parser.parse_args()

def modify_config(args):
    """根据命令行参数修改配置
    
    将用户通过命令行提供的参数应用到标定程序的配置对象中，
    实现对数据源、处理参数、模型参数和输出位置的自定义。
    
    参数:
        args: 解析后的命令行参数对象
    """
    import 角速度标定 as calib_module  # 导入标定模块，用于修改其配置
    
    # 修改数据文件夹配置：选择使用RTK数据、IMU数据或两者都使用
    if args.rtk_only:
        # 仅保留RTK数据文件夹配置
        calib_module.DATA_CONFIG['data_folders'] = [calib_module.DATA_CONFIG['data_folders'][0]]
    elif args.imu_only:
        # 仅保留IMU数据文件夹配置
        calib_module.DATA_CONFIG['data_folders'] = [calib_module.DATA_CONFIG['data_folders'][1]]
    
    # 修改合并分析配置：是否合并不同来源的数据进行分析
    if args.no_combined:
        calib_module.DATA_CONFIG['combined'] = False
    
    # 修改处理参数：滑动窗口和差分阈值，影响稳态点的识别
    calib_module.PROCESSING_CONFIG['window_size_ratio'] = args.window_size_ratio
    calib_module.PROCESSING_CONFIG['diff_threshold_ratio'] = args.diff_threshold_ratio
    
    # 修改模型参数：多项式拟合次数
    calib_module.MODEL_CONFIG['degree'] = args.poly_degree
    
    # 修改输出目录：用户可指定结果保存位置
    if args.output_dir:
        output_dir = os.path.abspath(args.output_dir)
        os.makedirs(output_dir, exist_ok=True)  # 确保输出目录存在
        
        # 更新输出配置：修改所有文件输出路径
        for key in calib_module.OUTPUT_CONFIG:
            if key.endswith('_file'):  # 只修改文件路径配置项
                calib_module.OUTPUT_CONFIG[key] = os.path.join(output_dir, calib_module.OUTPUT_CONFIG[key])
        
        # 更新可视化配置：修改图表保存路径
        calib_module.VISUALIZATION_CONFIG['save_path'] = os.path.join(output_dir, calib_module.VISUALIZATION_CONFIG['save_path'])

def show_results():
    """尝试打开结果图像
    
    在标定完成后，尝试根据操作系统类型自动打开生成的合并标定结果图表，
    方便用户直接查看结果而无需手动查找文件。
    """
    import 角速度标定 as calib_module  # 导入标定模块，获取图表路径配置
    import platform  # 用于识别操作系统类型
    import subprocess  # 用于调用系统命令
    
    # 获取合并图表路径
    plots_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 
                            calib_module.VISUALIZATION_CONFIG['save_path'])
    combined_plot = os.path.join(plots_dir, "combined_angular_velocity_plot.png")
    
    # 检查图表文件是否存在
    if os.path.exists(combined_plot):
        print(f"\n合并标定结果图表已保存到: {combined_plot}")
        
        # 根据不同操作系统，使用适当的命令打开图像文件
        system = platform.system()
        try:
            if system == 'Darwin':  # macOS系统
                subprocess.call(['open', combined_plot])
            elif system == 'Windows':  # Windows系统
                os.startfile(combined_plot)
            else:  # Linux或其他系统
                subprocess.call(['xdg-open', combined_plot])
        except Exception as e:
            print(f"无法自动打开图像: {e}")
            print(f"请手动打开图像文件: {combined_plot}")
    else:
        print(f"\n合并标定结果图表未找到。请检查是否成功生成图表。")

def print_banner():
    """打印命令行界面横幅
    
    在程序启动时打印美观的横幅，提升用户体验并显示程序名称。
    """
    banner = """
=================================================================
                   角速度标定工具 (Angular Velocity Calibration Tool)
=================================================================
    """
    print(banner)

def main():
    """主函数
    
    程序入口点，协调整个标定流程的执行，包括参数解析、配置修改、
    标定执行和结果展示等步骤。
    """
    # 打印程序横幅
    print_banner()
    
    # 解析命令行参数
    args = parse_arguments()
    
    # 根据参数修改配置
    modify_config(args)
    
    print("开始角速度标定过程...")
    print("="*60)
    
    # 运行标定主程序
    calibration_main()
    
    print("="*60)
    print("角速度标定完成!")
    
    # 如果用户指定了显示结果，尝试打开结果图表
    if args.show_results:
        show_results()

if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        # 捕获Ctrl+C等中断信号，优雅退出
        print("\n程序被用户中断")
        sys.exit(1)
    except Exception as e:
        # 捕获所有其他异常，显示错误信息并退出
        print(f"\n程序执行出错: {e}")
        sys.exit(1) 